package cn.psvmc.cxzapi.util.delivery;


import cn.psvmc.cxzapi.model.delivery.SfOrderCreate;
import cn.psvmc.cxzapi.model.delivery.SfOrderSearch;
import cn.psvmc.cxzapi.model.delivery.SfRoutesSearch;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description 顺丰物流对接（https://open.sf-express.com/）
 * @Author: YWX
 * @Date 2024/8/18 16:58
 **/
@Slf4j
public class SfAPIService {
    public static final Map<String, String> STATUS_MAP;

    static {
        STATUS_MAP = SfAPIService.createStatusMap();
    }

    public static String getDeliveryStatus(String status) {
        if (SfAPIService.STATUS_MAP.containsKey(status)) {
            return SfAPIService.STATUS_MAP.get(status);
        }
        return status;
    }

    // 创建状态映射的方法
    public static Map<String, String> createStatusMap() {
        Map<String, String> statusMap = new HashMap<>();

        // 将路由操作码和二级状态存储到映射中
        statusMap.put("10", "运送中");
        statusMap.put("11", "运送中");
        statusMap.put("14", "已清关");
        statusMap.put("15", "清关中");
        statusMap.put("16", "清关中");
        statusMap.put("17", "清关中");
        statusMap.put("18", "清关中");
        statusMap.put("30", "运送中");
        statusMap.put("31", "运送中");
        statusMap.put("33", "待派送");
        statusMap.put("3383", "待取件");
        statusMap.put("33133", "清关中");
        statusMap.put("3346", "已取消");
        statusMap.put("3355", "已退回");
        statusMap.put("3367", "已转寄");
        statusMap.put("3379", "已作废");
        statusMap.put("3385", "待取件");
        statusMap.put("34", "派送中");
        statusMap.put("36", "运送中");
        statusMap.put("43", "已揽收");
        statusMap.put("44", "派送中");
        statusMap.put("46", "已揽收");
        statusMap.put("50", "已揽收");
        statusMap.put("51", "已揽收");
        statusMap.put("54", "已揽收");
        statusMap.put("64", "运送中");
        statusMap.put("65", "运送中");
        statusMap.put("70", "待派送");
        statusMap.put("7083", "待取件");
        statusMap.put("7046", "已取消");
        statusMap.put("72", "运送中");
        statusMap.put("75", "运送中");
        statusMap.put("77", "运送中");
        statusMap.put("77133", "清关中");
        statusMap.put("7755", "已退回");
        statusMap.put("7779", "已作废");
        statusMap.put("80", "已签收");
        statusMap.put("86", "运送中");
        statusMap.put("87", "运送中");
        statusMap.put("88", "运送中");
        statusMap.put("89", "运送中");
        statusMap.put("98", "运送中");
        statusMap.put("992", "已退回");
        statusMap.put("991", "已转寄");
        statusMap.put("105", "运送中");
        statusMap.put("106", "运送中");
        statusMap.put("114", "运送中");
        statusMap.put("115", "运送中");
        statusMap.put("116", "运送中");
        statusMap.put("119", "运送中");
        statusMap.put("121", "待派送");
        statusMap.put("122", "派送中");
        statusMap.put("123", "派送中");
        statusMap.put("125", "待取件");
        statusMap.put("126", "待取件");
        statusMap.put("127", "待揽收");
        statusMap.put("128", "已签收");
        statusMap.put("129", "已揽收");
        statusMap.put("131", "已取消");
        statusMap.put("135", "已揽收");
        statusMap.put("136", "运送中");
        statusMap.put("137", "运送中");
        statusMap.put("138", "待揽收");
        statusMap.put("140", "运送中");
        statusMap.put("141", "已揽收");
        statusMap.put("147", "运送中");
        statusMap.put("151", "派送中");
        statusMap.put("152", "派送中");
        statusMap.put("153", "派送中");
        statusMap.put("154", "派送中");
        statusMap.put("186", "运送中");
        statusMap.put("187", "运送中");
        statusMap.put("188", "已揽收");
        statusMap.put("193", "运送中");
        statusMap.put("195", "运送中");
        statusMap.put("197", "运送中");
        statusMap.put("201", "拣货中");
        statusMap.put("202", "待揽收");
        statusMap.put("204", "派送中");
        statusMap.put("205", "已审单");
        statusMap.put("206", "仓库处理中");
        statusMap.put("207", "已取消");
        statusMap.put("208", "运送中");
        statusMap.put("211", "派送中");
        statusMap.put("218", "待取件");
        statusMap.put("220", "运送中");
        statusMap.put("221", "运送中");
        statusMap.put("229", "派送中");
        statusMap.put("230", "运送中");
        statusMap.put("231", "运送中");
        statusMap.put("302", "运送中");
        statusMap.put("306", "运送中");
        statusMap.put("405", "运送中");
        statusMap.put("406", "运送中");
        statusMap.put("407", "运送中");
        statusMap.put("408", "运送中");
        statusMap.put("570", "运送中");
        statusMap.put("571", "运送中");
        statusMap.put("604", "清关中");
        statusMap.put("605", "清关中");
        statusMap.put("606", "已清关");
        statusMap.put("607", "已揽收");
        statusMap.put("610", "清关中");
        statusMap.put("611", "运送中");
        statusMap.put("612", "清关中");
        statusMap.put("613", "清关中");
        statusMap.put("614", "清关中");
        statusMap.put("616", "清关中");
        statusMap.put("619", "运送中");
        statusMap.put("620", "运送中");
        statusMap.put("621", "清关中");
        statusMap.put("626", "到转第三方快递");
        statusMap.put("627", "已转寄");
        statusMap.put("630", "派送中");
        statusMap.put("631", "已退回");
        statusMap.put("632", "待取件");
        statusMap.put("634", "派送中");
        statusMap.put("642", "待取件");
        statusMap.put("646", "仓库处理中");
        statusMap.put("647", "待揽收");
        statusMap.put("648", "运送中");
        statusMap.put("649", "运送中");
        statusMap.put("651", "待揽收");
        statusMap.put("655", "待揽收");
        statusMap.put("656", "运送中");
        statusMap.put("657", "待取件");
        statusMap.put("658", "已签收");
        statusMap.put("660", "已取消");
        statusMap.put("681", "待取件");
        statusMap.put("701", "已签收");
        statusMap.put("900", "运送中");
        statusMap.put("901", "运送中");
        statusMap.put("930", "运送中");
        statusMap.put("931", "运送中");
        statusMap.put("932", "已转寄");
        statusMap.put("933", "派送中");
        statusMap.put("934", "待派送");
        statusMap.put("935", "已签收");
        statusMap.put("1105", "运送中");
        statusMap.put("1106", "运送中");
        statusMap.put("1635", "运送中");
        statusMap.put("8000", "已签收");
        statusMap.put("80006", "已签收");
        statusMap.put("80002", "已作废");
        statusMap.put("80005", "已签收");
        statusMap.put("80009", "已签收");
        statusMap.put("950", "已揽收");
        statusMap.put("980", "已签收");

        return statusMap;
    }

    /**
     * @Description 因Internet环境下，网络不是绝对可靠，用户系统下订单到顺丰后，不一定可以收到顺丰系统返回的数据，
     * 此接口用于在未收到返回数据时，查询订单创建接口客户订单当前的处理情况。
     * @Date 2024/8/18 10:31
     * @Author YWX
     * @Param [orderId]
     * @Return java.lang.String
     **/
    public static String checkOrder(SfOrderSearch param) throws UnsupportedEncodingException {
        //TODO
//        IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_SEARCH_ORDER_RESP; //订单结果查询接口
        String msgData = JSON.toJSONString(param);
//        return SfAPIService.sendPost(msgData, standardService);
        return "";
    }

    /**
     * @Description 下单
     * @Date 2024/9/8 22:12
     * @Author YWX
     * @Param [param]
     * @Return java.lang.String
     **/
    public static String createOrder(SfOrderCreate param) throws UnsupportedEncodingException {
        //TODO
//        IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_CREATE_ORDER; //下订单接口
//        String msgData = JSON.toJSONString(param);
//        return SfAPIService.sendPost(msgData, standardService);
        return "";
    }

    /**
     * @Description 路由查询（订单物流）
     * @Date 2024/9/8 22:53
     * @Author YWX
     * @Param [param]
     * @Return java.lang.String
     **/
    public static String checkRoutes(List<String> trackingNumber, String checkPhoneNo) throws UnsupportedEncodingException {
        SfRoutesSearch search = new SfRoutesSearch();
        search.setLanguage("zh-CN");
        String trackingType = "1";
        search.setTrackingType(trackingType);
        search.setTrackingNumber(trackingNumber);
        search.setMethodType("1");
        search.setCheckPhoneNo(checkPhoneNo);
        //todo
//        IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_SEARCH_ROUTES; //路由查询接口
//        String msgData = JSON.toJSONString(search);
//        return SfAPIService.sendPost(msgData, standardService);
        return "";
    }

    /**
     * @Description 发送请求
     * @Date 2024/9/8 22:10
     * @Author YWX
     * @Param [msgData, standardService]
     * @Return java.lang.String
     **/
//    private static String sendPost(String msgData, IServiceCodeStandard standardService) throws UnsupportedEncodingException {
//        CallExpressServiceTools tools = CallExpressServiceTools.getInstance();
//
//        //set common header
//        Map<String, String> params = new HashMap<>();
//
//        String timeStamp = String.valueOf(System.currentTimeMillis());
//
//        params.put("partnerID", ConfigKey.partnerID);  // 顾客编码 ，对应丰桥上获取的clientCode
//        params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
//        params.put("serviceCode", standardService.getCode());// 接口服务码
//        params.put("timestamp", timeStamp);
//        params.put("msgData", msgData);
//        params.put("msgDigest", tools.getMsgDigest(msgData, timeStamp, ConfigKey.md5Key));
//
//        String result = HttpClientUtil.post(ConfigKey.callUrl, params);
//        SfAPIService.log.info("顺丰物流接口请求参数：{}", params);
//        SfAPIService.log.info("顺丰物流接口请求结果:{}", result);
//        return result;
//    }

    /**
     * @Description 此接口用于订单状态推送,将订单状态的各类信息推送给对接的客户； 仅限于推送预约上门订单调度状态，非预约订单不推送。
     * @Date 2024/8/18 10:47
     * @Author YWX
     * @Param [orderId]
     * @Return java.lang.String
     **/
//    public static String pushOrderState(SfOrderState param) throws UnsupportedEncodingException {
//        IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_CREATE_ORDER;
//        CallExpressServiceTools tools = CallExpressServiceTools.getInstance();
//
//        //set common header
//        Map<String, String> params = new HashMap<>();
//
//        String timeStamp = String.valueOf(System.currentTimeMillis());
//        String msgData = JSON.toJSONString(param);
//
//        params.put("partnerID", ConfigKey.partnerID);  // 顾客编码 ，对应丰桥上获取的clientCode
//        params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
//        params.put("serviceCode", standardService.getCode());// 接口服务码
//        params.put("timestamp", timeStamp);
//        params.put("msgData", msgData);
//        params.put("msgDigest", tools.getMsgDigest(msgData, timeStamp, ConfigKey.md5Key));
//
//        return HttpClientUtil.post(ConfigKey.callUrl, params);
//    }
}
